@file:Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")

package com.sdkx.wear_os.utils

import android.annotation.SuppressLint
import com.sdkx.wear_os.utils.ToastLogUtils.logUtil
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import java.util.Calendar.YEAR

/**
 * Date转字符串
 * @param date 日期
 * @param pattern 格式
 */
@SuppressLint("SimpleDateFormat")
fun dateToString(date: Date? = null, pattern: String = "yyyy-MM-dd"): String {
    val simpleDateFormat = SimpleDateFormat(pattern) // yyyy-MM-dd HH:mm:ss
    return if (date == null) simpleDateFormat.format(Date(System.currentTimeMillis()))
    else simpleDateFormat.format(date)
}

/**
 * 字符串转Date
 * @param date 日期字符串
 * @param pattern 格式
 */
@SuppressLint("SimpleDateFormat")
fun stringToDate(date: String, pattern: String = "yyyy-MM-dd"): Date {
    val simpleDateFormat = SimpleDateFormat(pattern)
    return if (isValidDate(date, pattern)) simpleDateFormat.parse(date)
    else simpleDateFormat.parse(dateToString())
}


/**
 * 时间戳转String
 * @param timestamp 时间戳
 * @param pattern 格式
 */
@SuppressLint("SimpleDateFormat")
fun timestampToString(timestamp: Long, pattern: String = "yyyy-MM-dd"): String {
    val formatter = SimpleDateFormat(pattern)
    return formatter.format(Date(timestamp * 1000L))
}

/**
 * Date转时间戳
 * @param date 日期
 */
@SuppressLint("SimpleDateFormat")
fun dateToTimestamp(date: Date? = null): Long {
    return if (date == null) System.currentTimeMillis()
    else date.time / 1000L

}

/**
 * 秒转时分秒
 * @param seconds 秒数
 */
fun secondsToHMS(seconds: Long): String {
    val hours: Long = seconds / 3600
    val minutes: Long = seconds % 3600 / 60
    val remainingSeconds: Long = seconds % 60
    return hours.toString() + "小时 " + minutes + "分钟 " + remainingSeconds + "秒"
}

/**
 * 单独获取年月日
 * @param date 日期 若为空则是当前日期
 * @param field YEAR年 MONTH月 DATE日等（MONTH需要+1）
 */
fun getField(date: Date, field: Int = YEAR): Int {
    val calendar = Calendar.getInstance()
    calendar.time = date
    return calendar.get(field)
}

/**
 * 验证字符串是否是一个合法的日期格式
 */
fun isValidDate(date: String, template: String = "yyyy-MM-dd"): Boolean {
    var convertSuccess = true
    // 指定日期格式
    val format =
        SimpleDateFormat(template, Locale.CHINA)
    try {
        // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2015/02/29会被接受，并转换成2015/03/01
        format.isLenient = false
        format.parse(date)
    } catch (e: Exception) {
        // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
        convertSuccess = false
    }
    return convertSuccess
}

/**
 * 获取前n天日期、后n天日期
 *
 * @param distanceDay 前几天 如获取前7天日期则传-7即可；如果后7天则传7
 * @return
 */
@SuppressLint("SimpleDateFormat")
fun getOldDate(distanceDay: Int, date: Calendar = Calendar.getInstance()): String {
    val dft = SimpleDateFormat("yyyy-MM-dd")
    date[Calendar.DATE] = date[Calendar.DATE] + distanceDay
    var endDate: Date? = null
    try {
        endDate = dft.parse(dft.format(date.time))
    } catch (e: ParseException) {
        e.printStackTrace()
    }
    logUtil("前${distanceDay}天==", dft.format(endDate))
    return dft.format(endDate)
}
